package com.ruoyi.api.controller;

import java.math.BigDecimal;
import java.util.List;

import cn.hutool.json.JSONObject;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.standingbook.v2toilet.domain.vo.V2ToiletBillVo;
import com.ruoyi.stat.toilet.domain.bo.V2ToiletBillStatBo;
import com.ruoyi.stat.toilet.domain.vo.CommunityToiletStatVo;
import com.ruoyi.stat.toilet.domain.vo.ToiletCleanImgVo;
import com.ruoyi.stat.toilet.domain.vo.V2ToiletBillStatVo;
import com.ruoyi.stat.toilet.logic.CommunityToiletStatLogic;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.R;

import lombok.RequiredArgsConstructor;

/**
 * 公厕维护数据统计汇总
 *
 * @author aronma
 * @date 2023-06-06
 */
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/api/stat/communityToilet")
public class CommunityToiletStatController extends BaseController {

    private final CommunityToiletStatLogic communityToiletStatLogic;

    /**
     * 获取街道及街区列表与指定数量的月份
     *
     * @param monthNum 月数(包含本月)
     */
    @GetMapping("/streetsAndMonths")
    public R<JSONObject> getStreetsAndMonths(Integer monthNum) {
        if (monthNum < 1)
            return R.fail("月数不允许小于1，请核查参数");
        return R.ok(communityToiletStatLogic.getStreetsAndMonths(true, monthNum));
    }

    /**
     * 获取街道及街区 公厕数量
     *
     * @param id   月数(包含本月)
     * @param type 类型 街道:1 或 社区:2
     */
    @GetMapping("/communityToiletStatNum")
    public R<List<CommunityToiletStatVo>> getCommunityToiletStatNum(String id, String type) {
        if (StringUtils.isEmpty(id))
            return R.fail("街道或街区Id不允许为空，请核查参数");
        if (StringUtils.isEmpty(type))
            return R.fail("街道或街区类型不允许为空，请核查参数");
        return R.ok(communityToiletStatLogic.getCommunityToiletStatNum(id, type));

    }

    /**
     * 获取街道或社区 日期统计
     *
     * @param id        街道或社区 Id
     * @param type      类型 街道:1 或 社区:2
     * @param queryDate 指定日期 {yyyy-dd-mm}
     */
    @GetMapping("/communityToiletStatDate")
    public R<JSONObject> getCommunityToiletStatDate(String id, String type, String queryDate) {
        if (StringUtils.isEmpty(id))
            return R.fail("街道或街区Id不允许为空，请核查参数");
        if (StringUtils.isEmpty(type))
            return R.fail("街道或街区类型不允许为空，请核查参数");
        if (StringUtils.isEmpty(queryDate))
            return R.fail("统计日期不允许为空，请核查参数");
        return R.ok(communityToiletStatLogic.getCommunityToiletStatDate(id, type, DateUtils.parseDate(queryDate)));

    }


    /**
     * 获取街道或社区 月统计
     *
     * @param id        街道或社区 Id
     * @param type      类型 街道:1 或 社区:2
     * @param queryDate 指定日期 {yyyy-dd}
     */
    @GetMapping("/communityToiletStatMonth")
    public R<JSONObject> getCommunityToiletStatMonth(String id, String type, String queryDate) {
        if (StringUtils.isEmpty(id))
            return R.fail("街道或街区Id不允许为空，请核查参数");
        if (StringUtils.isEmpty(type))
            return R.fail("街道或街区类型不允许为空，请核查参数");
        if (StringUtils.isEmpty(queryDate))
            return R.fail("统计月份不允许为空，请核查参数");
        return R.ok(communityToiletStatLogic.getCommunityToiletStatMonth(id, type, DateUtils.parseDate(queryDate)));

    }

    /**
     * 获取公厕 日期统计
     *
     * @param toiletName 公厕名称
     * @param queryDate  指定日期 {yyyy-dd-mm}
     */
    @GetMapping("/toiletStatDate")
    public R<JSONObject> getToiletStatDate(String toiletName, String queryDate) {
        if (StringUtils.isEmpty(toiletName))
            return R.fail("公厕名称不允许为空，请核查参数");
        if (StringUtils.isEmpty(queryDate))
            return R.fail("统计日期不允许为空，请核查参数");
        return R.ok(communityToiletStatLogic.getToiletStatDate(toiletName, DateUtils.parseDate(queryDate)));

    }

    /**
     * 获取公厕 月统计
     *
     * @param toiletName 公厕名称
     * @param queryDate  指定日期 {yyyy-dd}
     */
    @GetMapping("/toiletStatMonth")
    public R<JSONObject> getToiletStatMonth(String toiletName, String queryDate) {
        if (StringUtils.isEmpty(toiletName))
            return R.fail("公厕名称不允许为空，请核查参数");
        if (StringUtils.isEmpty(queryDate))
            return R.fail("统计月份不允许为空，请核查参数");
        return R.ok(communityToiletStatLogic.getToiletStatMonth(toiletName, DateUtils.parseDate(queryDate)));

    }


    /**
     * 获取街道及街区列表与指定数量的天数
     *
     * @param dateNum 天数(包含当天)
     */
    @GetMapping("/streetsAndDates")
    public R<JSONObject> getStreetsAndDates(Integer dateNum) {
        if (dateNum < 1)
            return R.fail("天数不允许小于1，请核查参数");
        return R.ok(communityToiletStatLogic.getStreetsAndDates(dateNum));

    }

    /**
     * 获取街道或社区 七日  日统计
     *
     * @param id        街道或社区 Id
     * @param type      类型 街道:1 或 社区:2
     * @param queryDate 指定日期 {yyyy-dd}
     */
    @GetMapping("/communityToiletStatDateAndMaxMin")
    public R<JSONObject> getCommunityToiletStatDateAndMaxMin(String id, String type, String queryDate) {
        if (StringUtils.isEmpty(id))
            return R.fail("街道或街区Id不允许为空，请核查参数");
        if (StringUtils.isEmpty(type))
            return R.fail("街道或街区类型不允许为空，请核查参数");
        if (StringUtils.isEmpty(queryDate))
            return R.fail("统计日期不允许为空，请核查参数");
        return R.ok(communityToiletStatLogic.getCommunityToiletStatDateAndMaxMin(id, type, DateUtils.parseDate(queryDate)));
    }

    /**
     * 获取街道或社区 整月  日统计
     *
     * @param toiletName 公厕名称
     * @param queryDate  指定月份 {yyyy-dd}
     */
    @GetMapping("/communityToiletStatMonthAndMaxMin")
    public R<JSONObject> getCommunityToiletStatMonthAndMaxMin(String toiletName, String queryDate) {
        if (StringUtils.isEmpty(toiletName))
            return R.fail("公厕名称不允许为空，请核查参数");
        if (StringUtils.isEmpty(queryDate))
            return R.fail("统计月份不允许为空，请核查参数");
        return R.ok(communityToiletStatLogic.getCommunityToiletStatMonthAndMaxMin(toiletName, DateUtils.parseDate(queryDate)));
    }

    /**
     * 获取街道或社区 8张 大屏展示图片
     */
    @GetMapping("/communityToiletCleanImgs")
    public R<List<ToiletCleanImgVo>> getCommunityToiletCleanImgs(String id, String type, String queryDate) {
        return R.ok(communityToiletStatLogic.getCommunityToiletCleanImgs(id, type, DateUtils.parseDate(queryDate)));
    }

    @GetMapping("/toiletBillsByDate")
    public R<List<V2ToiletBillStatVo>> getToiletBillsByDate(String id, String type, String queryDate) {
        return R.ok(communityToiletStatLogic.queryToiletBillByDate(id, type, DateUtils.parseDate(queryDate)));
    }

    @GetMapping("/toiletBillsByMonth")
    public R<List<V2ToiletBillStatVo>> getToiletBillsByMonth(String id, String type, String queryDate) {
        return R.ok(communityToiletStatLogic.queryToiletBillByMonth(id, type, DateUtils.parseDate(queryDate)));
    }

    @GetMapping("/toiletBills")
    public R<List<V2ToiletBillStatVo>> getToiletBills(String community, String toiletName, String item, String queryDate) {
        if (StringUtils.isEmpty(community))
            return R.fail("社区不允许为空，请核查参数");
        if (StringUtils.isEmpty(toiletName))
            return R.fail("公厕名称不允许为空，请核查参数");
        if (StringUtils.isEmpty(item))
            return R.fail("查询项不允许为空，请核查参数");
        if (StringUtils.isEmpty(queryDate))
            return R.fail("查询日期不允许为空，请核查参数");
        V2ToiletBillStatBo bo = new V2ToiletBillStatBo();
        bo.setCommunity(community);
        bo.setToiletName(toiletName);
        bo.setItem(item);
        bo.setInspectDate(DateUtils.parseDate(queryDate));
        return R.ok(communityToiletStatLogic.getToiletBills(bo));
    }

    @GetMapping("/toiletBillSchedule")
    public R<String> getToiletBillCount(String queryDate) {
        if (StringUtils.isEmpty(queryDate))
            return R.fail("查询日期不允许为空，请核查参数");
        return R.ok("", communityToiletStatLogic.getToiletBillCount(DateUtils.parseDate(queryDate)));
    }
}
